package com.yaolifei.flower.web.module;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.nutz.castor.Castors;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Filters;

import com.yaolifei.flower.core.Model;
import com.yaolifei.flower.core.ModelColumn;
import com.yaolifei.flower.core.ModelColumnType;
import com.yaolifei.flower.core.ModelService;
import com.yaolifei.flower.web.util.extjs.ExtJS;
import com.yaolifei.flower.web.util.extjs.ExtJSTreeBuild;
import com.yaolifei.flower.web.util.extjs.PropertyMapper;

@IocBean
@At("/model")
@Filters
public class ModelModule {

	@Inject
	private ModelService modelService;
	
	@At
	public void upload(HttpServletRequest req) {
		String name = req.getParameter("name");
		System.out.println("----------------------------");
		System.out.println(name);
	}

	@At
	public Object getModelTree(String node, String type) {
		// 获取模型列
		if ("model".equals(type)) {
			List<ModelColumn> list = modelService.getModelColumnList(Castors.me().castTo(node, int.class));
			return ExtJS.buildTree(list, new ExtJSTreeBuild<ModelColumn>() {
				@Override
				public Object[] getTreeConfig(ModelColumn column) {
					return new Object[]{column.getColumnId(), column.getColumnName(), true};
				}
			});
		} else { // 获取模型组/模型对象
			List<Model> list = null;
			if (ExtJS.isRootNode(node)) {
				list = modelService.getTopModels();
			} else {
				list = modelService.getChildren(Castors.me().castTo(node, int.class));
			}
			return ExtJS.buildTree(list, new ExtJSTreeBuild<Model>() {
				@Override
				public Object[] getTreeConfig(Model t) {
					return new Object[]{t.getModelId(), t.getModelName(), false};
				}
				@Override
				public void map(Map<String, Object> map, Model t) {
					map.put("iconCls", t.isGroup() ? "x-tree-node-icon" : t.isCreated() ? "icon_table_created" : "icon_table");
					map.put("type", t.isGroup() ? "group" : "model");
				}
			});
		}
	}
	
	@At
	public Object getModelColumnGrid(int modelId) {
		List<ModelColumn> list = modelService.getModelColumnList(modelId);
		
		return ExtJS.buildGrid(list, new PropertyMapper<ModelColumn>() {
			public void map(Map<String,Object> map, ModelColumn column) {
				map.put("column_id", column.getColumnId());
				map.put("column_name", column.getColumnName());
				map.put("physical_name", column.getPhysicalName());
				map.put("column_type", column.getColumnType().getValue());
				map.put("column_length", column.getColumnLength());
				map.put("nullable", column.isNullable());
				map.put("default_value", column.getDefaultValue());
				map.put("created", column.isCreated());
				map.put("range", column.getSelectRange());
				map.put("formatter", column.getFormatter());
				map.put("validator", column.getValidator());
			};
		});
	}
//
//	@RequestMapping
//	@ResponseBody
//	public JSONObject addModel(HttpParams params) {
//		String type = params.getStringParameter("type");
//		String name = params.getStringParameter("name");
//		String physical = params.getStringParameter("physical");
//		String parentId = params.getStringParameter("parentId");
//		
//		if ("column".equals(type)) {
//			int dataType = params.getIntParameter("dataType");
//			int columnLength = params.getIntParameter("columnLength");
//			boolean isNullable = params.getBooleanParameter("isNullable");
//			String defaultValue = params.getStringParameter("defaultValue");
//			
//			ModelColumn column = new ModelColumn();
//			column.setColumnName(name);
//			column.setPhysicalName(physical);
//			column.setModelId(parentId);
//			column.setColumnType(ModelColumnType.valueOf(dataType));
//			column.setColumnLength(columnLength);
//			column.setNullable(isNullable);
//			column.setDefaultValue(StringUtils.isBlank(defaultValue) ? null : defaultValue);
//			modelService.addModelColumn(column);
//		} else {
//			Model model = new Model();
//			model.setModelName(name);
//			model.setPhysicalName(physical);
//			model.setIsGroup("group".equals(type));
//			if (ExtJS.isRootNode(parentId)) {
//				parentId = null;
//			}
//			model.setParentId(parentId);
//			modelService.addModel(model);
//		}
//		return ExtJS.ok();
//	}
//
//	@RequestMapping
//	@ResponseBody
//	public JSONObject deleteModel(String uid, String type) {
//		if ("column".equals(type)) {
//			modelService.deleteModelColumn(uid);
//		} else {
//			modelService.deleteModel(uid);
//		}
//		return ExtJS.ok();
//	}
//	
//	@RequestMapping
//	@ResponseBody
//	public JSONObject getModelMeta(String type, String uid) {
//		JSONObject json = new JSONObject();
//		if ("group".equals(type)) {
//			Model model = modelService.getModel(uid);
//			if (model != null) {
//				json.put("model_name", model.getModelName());
//				json.put("physical_name", model.getPhysicalName());
//			} 
//		} else if ("model".equals(type)) {
//			Model model = modelService.getModel(uid);
//			if (model != null) {
//				json.put("physical_name", model.getPhysicalName());
//				json.put("model_name", model.getModelName());
//				json.put("created", model.isCreated());
//			}
//		} else if ("column".equals(type)) {
//			ModelColumn column = modelService.getModelColumn(uid);
//			if (column != null) {
//				json.put("column_name", column.getColumnName());
//				json.put("physical_name", column.getPhysicalName());
//				json.put("column_type", column.getColumnTypeValue());
//				json.put("column_length", column.getColumnLength());
//				json.put("nullable", column.isNullable());
//				json.put("default_value", column.getDefaultValue());
//				json.put("created", column.isCreated());
//				json.put("range", column.getRange());
//				json.put("formatter", column.getFormatter());
//				json.put("validator", column.getValidator());
//			}
//		}
//		return ExtJS.ok().put("model", json);
//	}
//	
	@At
	public Object getModelColumnType() {
		ModelColumnType[] types = ModelColumnType.values();
		return ExtJS.buildGrid(Arrays.asList(types));
	}
//	
//	@RequestMapping
//	@ResponseBody
//	public JSONObject editModel(String type, String uid, String column, String value) {
//		String sql = null;
//		if ("column".equals(type)) {
//			sql = "update `t_sys_model_column` set `" + column + "` = ? where column_id = ?";
//		} else {
//			sql = "update `t_sys_model` set `" + column + "` = ? where model_id = ?";
//		}
//		Context.getJdbcTemplate().update(sql, new Object[] { value, uid });
//		return ExtJS.ok();
//	}
//	
//	@RequestMapping
//	@ResponseBody
//	public JSONObject buildModel(String ids, String type) {
//		String[] idArr = ids.split(",");
//		if ("model".equals(type)) {
//			for (String id : idArr) {
//				modelService.buildModelTable(id);
//			}
//		} else {
//			for (String id : idArr) {
//				modelService.buildModelColumn(id);
//			}
//		}
//		return ExtJS.ok();
//	}
	
}